#ifndef COLLABORATION_MANAGER_H
#define COLLABORATION_MANAGER_H

#include <QObject>
#include <QString>
#include <QMap>
#include <QList>
#include <QWebSocket>
#include <QJsonObject>

namespace CollaborativeDesign {

// 用户信息结构
struct User {
    QString id;              // 用户ID
    QString name;            // 用户名
    QString avatar;          // 头像
    bool online;             // 在线状态
    QString currentFile;     // 当前编辑的文件
};

// 变更信息结构
struct Change {
    QString id;              // 变更ID
    QString userId;          // 用户ID
    QString filePath;        // 文件路径
    QJsonObject data;        // 变更数据
    QDateTime timestamp;     // 时间戳
};

// 协作会话结构
struct Session {
    QString id;              // 会话ID
    QString name;            // 会话名称
    QList<QString> userIds;  // 参与用户ID列表
    QList<QString> filePaths;// 相关文件路径列表
    QDateTime createTime;    // 创建时间
};

// 协作管理器类
class CollaborationManager : public QObject
{
    Q_OBJECT

public:
    CollaborationManager();
    ~CollaborationManager();

    // 初始化协作会话
    bool initSession(const QString& sessionId);
    
    // 加入协作会话
    bool joinSession(const QString& sessionId, const QString& userId);
    
    // 离开协作会话
    bool leaveSession(const QString& sessionId, const QString& userId);
    
    // 获取会话中的用户列表
    QList<User> getSessionUsers(const QString& sessionId);
    
    // 发送变更
    bool sendChange(const Change& change);
    
    // 获取当前用户
    User getCurrentUser() const;
    
    // 设置当前用户
    void setCurrentUser(const User& user);
    
    // 获取所有会话
    QList<Session> getAllSessions();
    
    // 创建新会话
    Session createSession(const QString& name);

signals:
    // 用户加入信号
    void userJoined(const QString& sessionId, const User& user);
    
    // 用户离开信号
    void userLeft(const QString& sessionId, const QString& userId);
    
    // 收到变更信号
    void changeReceived(const Change& change);
    
    // 会话状态变更信号
    void sessionStatusChanged(const QString& sessionId, const QString& status);

private slots:
    // 处理WebSocket连接
    void onConnected();
    
    // 处理WebSocket断开
    void onDisconnected();
    
    // 处理WebSocket消息
    void onTextMessageReceived(const QString& message);

private:
    // 初始化WebSocket
    void initWebSocket();
    
    // 处理变更
    void handleChange(const Change& change);
    
    // 广播变更
    void broadcastChange(const Change& change);
    
    // 验证变更
    bool validateChange(const Change& change);

private:
    QWebSocket m_webSocket;                  // WebSocket客户端
    QString m_serverUrl;                     // 服务器URL
    User m_currentUser;                      // 当前用户
    QString m_currentSessionId;              // 当前会话ID
    QMap<QString, Session> m_sessions;       // 会话映射表
    QMap<QString, User> m_users;             // 用户映射表
    QList<Change> m_pendingChanges;          // 待处理的变更
};

} // namespace CollaborativeDesign

#endif // COLLABORATION_MANAGER_H 